package com.gper.edu.mytrait

/**
 * 动态混入特质： 在不修改原有类定义的基础上，增加原有类的功能  开闭原则
 */

trait Fly2{
  def fly(): Unit = {
    println("==我会飞行.")
  }
}

abstract class Duck2 {
  def sayHello()
}

object TraitMixinDemo {

  def main(args: Array[String]): Unit = {
    /**
     * 动态混入特质
     * 在不修改鸭子类的情况下，给鸭子增加会飞的功能
     */
    val duck = new Duck with Fly2
    duck.fly
    duck.swimming

    /**
     * 抽象类混入特质的实例
     * 抽象类的方法实现放在所有特质最后
     */
    val duck2 = new Duck2 with Fly2 {
      override def sayHello(): Unit = {
        println("say hello world")
      }
    }
    duck2.fly()
    duck2.sayHello()
    println("====================new Duck with Operator2 with Operator4=======================")
    /**
     * 混入多个特质
     * 特质声明: 是从左到右，
     * 方法执行顺序: 从右到左(最右边的特质方法会覆盖其左特质的方法)
     */
    val duck3 = new Duck with Operator2 with Operator4
    duck3.insert(123)

    println("=====================new Duck with Operator4 with Operator2======================")
    /**
     * 混入多个特质
     * 特质声明: 是从左到右，
     * 方法执行顺序: 从右到左(最右边的特质方法会覆盖其左特质的方法)
     */
    val duck4 = new Duck with Operator4 with Operator2
    duck4.insert(123)
  }
}

trait Operator{
  def insert(data : Int)
}

trait Operator1 extends Operator {
  def insert(data : Int): Unit ={
    println("Operator1 insert value:"+data)
  }
}

trait Operator2 extends Operator1 {
  override def insert(data : Int): Unit ={
    println("Operator2 call insert method:")
    super.insert(data)

  }
}

trait Operator3 extends Operator {
  def insert(data : Int): Unit ={
    println("Operator3 insert value:"+data)
  }
}

trait Operator4 extends Operator3 {
  override def insert(data : Int): Unit ={
    println("Operator4 call insert method : ")
    super.insert(data)
  }
}